#include "socket.h"
#include <fcntl.h>
int mainSocketServer(){

	int sock;

	struct sockaddr_un data;

	system("unlink socket_path");

	memset(&data,0,sizeof(struct sockaddr_un));

	data.sun_family = AF_UNIX;

	strcpy(data.sun_path, SOCK_PATH);

	crearSocket(&sock);

	realizarBind(sock,data);

	realizarListen(sock);

	aceptarCliente(sock,data);

	return sock;
}

int mainSocketCliente(){

	int sock;

	struct sockaddr_un data;

	memset(&data,0,sizeof(struct sockaddr_un));

	data.sun_family = AF_UNIX;

	strcpy(data.sun_path, SOCK_PATH);

	crearSocket(&sock);

	conectar(&sock,data);

	return sock;
}

/*__________________________________________________________________________________________*/

int crearSocket(int* nuevoSocket){

	*nuevoSocket = socket(AF_UNIX, SOCK_STREAM, 0);

	if(*nuevoSocket < 0){
		printf("Fallo socket()\n");
		return 1;
	}
	else{
		printf("el socket hijo es %d\n",*nuevoSocket);
		return 0;
	}

}

/*__________________________________________________________________________________________*/

int realizarBind(int nuevoSocket,struct sockaddr_un local){

	int resultado;

	resultado = bind(nuevoSocket, (struct sockaddr*)&local, SUN_LEN(&local));

	if(resultado == EL_ERROR){
		printf("Fallo bind()\n");
		return 1;
	}
	else
		return 0;
}

/*__________________________________________________________________________________________*/

int realizarListen(int nuevoSocket){

	int resultado;

	resultado = listen(nuevoSocket,1);

	if(resultado != 0){
		printf("Fallo listen()\n");
		return 1;
	}
	else
		return 0;
}

/*__________________________________________________________________________________________*/

int aceptarCliente(int nuevoSocket,struct sockaddr_un local){

	int socketCliente;
	int len;

	len = sizeof(struct sockaddr);

	socketCliente = accept(nuevoSocket,NULL,NULL);
	if(socketCliente == -1) {
			printf("Fallo accept()\n");
			return (-1);
	}
	else{
		return socketCliente;
	}
}
/*________________________________________________________________________________*/

int cerrarSocket(int*nuevoSocket){

	close(*nuevoSocket);

	return 0;

}

/*________________________________________________________________________________*/

int conectar(int* nuevoSocket,struct sockaddr_un local){

	int resultado;
resultado = connect(*nuevoSocket, (struct sockaddr *)&local, SUN_LEN(&local));

if(resultado == 0){
	printf("conectoCliente\n");
	return 0;
}

else{
	return 1;
}

}

int enviarDatos(char*buffer,int tamanio,int socketEnvio){

	int resultado;
	resultado = send(socketEnvio,buffer,tamanio,0);

	if(resultado == EL_ERROR){
		printf("EL_ERROR en send()\n");
		return 1;
	}
	else{
		//printf("Envio exitoso\n");
		return 0;
	}

}

/*________________________________________________________________________________*/

uint8_t recibirDatos(char*buffer,int socketRecv){

	int resultado;

	resultado = recv(socketRecv,buffer,1024,0);

	if(resultado > 0){
					uint8_t id;
						uint16_t tamanio;

						memcpy(&id,buffer,sizeof(uint8_t));
						memcpy(&tamanio,buffer+sizeof(uint8_t),sizeof(uint16_t));
						char* data=malloc(sizeof(uint8_t)*tamanio+1);//sumo 1 por el \0 final
						memcpy(data,buffer+sizeof(uint8_t)+sizeof(uint16_t),tamanio*sizeof(uint8_t));
						data[tamanio] = '\0';
						if(tamanio!=0) printf("%s",data);

		free(data);

		return id;

	}
	if(resultado==0){
		printf("no llego nada");

		return -1;
	}

	else{
		printf("Recepcion fallida consola\n");
		return (-1);
	}


}
